#include "structures.h"

Couleur::Couleur() : red(1), green(1), blue(1)
{

}

Couleur::Couleur(float r, float g, float b) : red(r), green(g), blue(b)
{

}

float Couleur::getBleu() const
{
	if(blue < 0)
		return 0;
	else if(blue > 1)
		return 1;
	else
		return blue;
}

float Couleur::getRouge() const
{
	if(red < 0)
		return 0;
	else if(red > 1)
		return 1;
	else
		return red;
}

float Couleur::getVert() const
{
	if(green < 0)
		return 0;
	else if(green > 1)
		return 1;
	else
		return green;
}

Couleur::Couleur(const Couleur& c) : red(c.red), green(c.green), blue(c.blue){}

Couleur& Couleur::operator+=(Couleur const& couleur){
    red += couleur.red;
    green += couleur.green;
    blue += couleur.blue;

    return *this;
}


Couleur Couleur::operator* (Couleur const& couleur)
{
	Couleur c(*this);
	c.red *= couleur.red;
    c.green *= couleur.green;
    c.blue *= couleur.blue;

    return c;
}

Couleur& Couleur::operator=(const Couleur &c)
{
	red=c.red;
	blue = c.blue;
	green = c.green;

	return *this;
}

Couleur& Couleur::operator-=(Couleur const& couleur){
    red -= couleur.red;
    green -= couleur.green;
    blue -= couleur.blue;

    return *this;
}


Couleur Couleur::operator- (Couleur const& c)
{
    Couleur couleur(*this);
    couleur.red -= c.red;
    couleur.green -= c.green;
    couleur.blue -= c.blue;

    return couleur;
}

Couleur Couleur::operator+ (Couleur const& c)
{
    Couleur couleur(*this);
    couleur.red += c.red;
    couleur.green += c.green;
    couleur.blue += c.blue;	

    return couleur;
}


Couleur Couleur::operator* (float coeff){
	Couleur c(*this);
	c.red *=coeff;
	c.green *=coeff;
	c.blue *=coeff;
	return c;
}

Couleur Couleur::operator/ (float coeff){
	return this->operator*(1/coeff);
}


inline void Couleur::verifBorne(){

	if(red < 0)
		red=0;
	else if(red>1)
		red = 1;
	if(green < 0)
		green=0;
	else if(green>1)
		green = 1;
	if(blue < 0)
		blue=0;
	else if(blue>1)
		blue = 1;
}

bool Couleur::operator==(const Couleur &c)
{
	return (this->blue == c.blue && this->red == c.red && this->green == c.green);
}

float Couleur::delta(const Couleur& c) const
{
	return fabsl(red - c.red) + fabsl(green - c.green) + fabsl(blue - c.blue);

}